/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package videorent;

import java.util.ArrayList;
import java.util.Iterator;

/** Representa  una operacion, puede ser de alquiler o de compra.
 *
 * @author Rafael
 */
public abstract class Operacion {

    private double total;
    private double montoEntregado;
    private ArrayList<Object> articulos;
    /** Indica el precio de una pelicula*/
    protected static final double PRECIO_PELICULA = 90;
    protected static final double PRECIO_SERIE = 100;
    protected static final double PRECIO_JUEGO_EDUCATIVO = 50;
    protected static final double PRECIO_JUEGO_RECREATIVO = 250;
    protected static final double MULTA_PELICULA = 5;
    protected static final double MULTA_SERIE = 5;
    protected static final double MULTA_JUEGO_EDUCATIVO = 10;
    protected static final double MULTA_JUEGO_RECREATIVO = 1;
    protected static final int PRESTAMO_DIAS_PELICULA = 3;
    protected static final int PRESTAMO_DIAS_SERIE = 3;
    protected static final int PRESTAMO_DIAS_JUEGO_EDUCATIVO = 2;
    protected static final int PRESTAMO_DIAS_JUEGO_RECREATIVO = 5;
    protected static final double ALQUILER_PELICULA = 10;
    protected static final double ALQUILER_SERIE = 10;
    protected static final double ALQUILER_JUEGO_EDUCATIVO = 7;
    protected static final double ALQUILER_JUEGO_RECREATIVO = 12;

    /** Es el Constructor de la Venta
     * @param total monto total de la Venta.
     * @param montoEntregado monto entregado por una persona.
     * @param articulos monto entregado por una persona.
     */
    public Operacion(double total, double montoEntregado, ArrayList<Object> articulos) {
        this.total = total;
        this.montoEntregado = montoEntregado;
        this.articulos = articulos;
    }

    public Operacion(ArrayList<Object> articulos) {
        this.total = 0;
        this.montoEntregado = 0;
        this.articulos = articulos;
    }

    public Operacion() {
        this.total = 0;
        this.montoEntregado = 0;
        this.articulos = new ArrayList<Object>();
    }

    /**
     * Este metodo calcula, el precio de la lista de articulos.
     * @return el total a pagar por los articulos a comprar o alquilar.
     */
    public abstract double obtenerSubtotal();

    /** Este metodo se engarga de dar la lista de los articulos de la venta.
     * @return ArrayList<Object> Lista de articulos de la venta.
     */
    public ArrayList<Object> getArticulos() {
        return (ArrayList<Object>) articulos.clone();
    }

    /** Este metodo se engarga de asignar la lista de los articulos de la venta.
     * @param articulos Lista de articulos de la venta.
     */
    public void setArticulos(ArrayList<Object> articulos) {
        this.articulos = articulos;
    }

    /** Este metodo se engarga de dar el monto entregado de la venta.
     * @return Monto entregado de la venta.
     */
    public double getMontoEntregado() {
        return montoEntregado;
    }

    /** Este metodo se engarga de asignar el monto entregado a la venta.
     * @param montoEntregado en la venta.
     */
    public void setMontoEntregado(double montoEntregado) {
        this.montoEntregado = montoEntregado;
    }

    /** Este metodo se engarga de dar el total de la venta.
     * @return  monto total de la venta.
     */
    public double getTotal() {
        return total;
    }

    /** Este metodo se engarga de asignar el total de la venta.
     * @param total monto total de la venta.
     */
    public void setTotal(double total) {
        this.total = total;
    }

    /** Este metodo determina la cantidad de articulos audiovisuales almacenados
     * @return cantidad de articulos audiovisuales almacenados
     */
    public int obtenerCantArticulosAudiovisuales() {
        int cantidad = 0;

        ArrayList<Object> arts = this.getArticulos();
        Iterator<Object> it = arts.iterator();
        Object o;
        while (it.hasNext()) {
            o = it.next();
            if (o instanceof Audiovisual) {
                cantidad++;
            }
        }
        return cantidad;
    }

    /** Este metodo determina la cantidad de articulos audiovisuales almacenados
     * @return cantidad de articulos audiovisuales almacenados
     */
    public int obtenerCantArticulosInteractivos() {
        int cantidad = 0;

        ArrayList<Object> arts = this.getArticulos();
        Iterator<Object> it = arts.iterator();
        Object o;
        while (it.hasNext()) {
            o = it.next();
            if (o instanceof Interactivo) {
                                       
                cantidad = cantidad + 1;
            }
        }
        return cantidad;
    }

    public boolean contieneArticulo(String codArt) {
        // obtengo los articulos
        ArrayList<Object> arts = this.getArticulos();
        Iterator<Object> it = arts.iterator();
        Articulo a;
        boolean booleano = false;
        // Itero en busqueda del que tenga el mismo codigo.
        while (it.hasNext()) {
            a = (Articulo) it.next();
            if (a.getCodigo().equals(codArt)) {
                booleano = true;
                break;
            }
        }
        return booleano;
    }

    public Object getArticulo(String codArt) {
        // obtengo los articulos
        ArrayList<Object> arts = this.getArticulos();
        Iterator<Object> it = arts.iterator();
        Object o = null;
        // Itero en busqueda del que tenga el mismo codigo.
        while (it.hasNext()) {
            o = it.next();
            Articulo a = (Articulo) o;
            if (a.getCodigo().equals(codArt)) {
                break;
            }
        }
        return o;
    }

    public void rmoverArticulo(Object o) {
        this.articulos.remove(o);
    }
     public int getCantArticulos(String codArt) {
        // obtengo los articulos
        ArrayList<Object> arts = this.getArticulos();
        Iterator<Object> it = arts.iterator();
        Object o = null;
        int i =0;
        // Itero en busqueda del que tenga el mismo codigo.
        while (it.hasNext()) {
            o = it.next();
            Articulo a = (Articulo) o;
            if (a.getCodigo().equals(codArt)) {
                i++;
            }
        }
        return i;
    }
}
